﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using SMA.GENTEv1.Dados;

namespace SMA.GENTEv1
{
    public class OrganizacaoEndereco
    {
        #region Variaveis Membro
        private int _idOrganizacaoEndereco;
        private int _idOrganizacao;
        private TipoEndereco _tipoEndereco;
        private string _logradouro;
        private Double _numero;
        private string _complemento;
        private string _bairro;
        private Cidade _cidade;
        private Double _cep;
        private StatusEndereco _statusEndereco;
        private TipoLogradouro _tipoLogradouro;
        private GENTEEntities _context;
        #endregion

        #region Parametros
        public int IdOrganizacaoEndereco
        {
            get { return _idOrganizacaoEndereco; }
            set { _idOrganizacaoEndereco = value; }
        }
        public int IdOrganizacao
        {
            get { return _idOrganizacao; }
            set { _idOrganizacao = value; }
        }
        public string Logradouro
        {
            get { return _logradouro; }
            set { _logradouro = value; }
        }
        public Double Numero
        {
            get { return _numero; }
            set { _numero = value; }
        }
        public string Complemento
        {
            get { return _complemento; }
            set { _complemento = value; }
        }
        public string Bairro
        {
            get { return _bairro; }
            set { _bairro = value; }
        }
        public Double Cep
        {
            get { return _cep; }
            set { _cep = value; }
        }
        public TipoEndereco TipoEndereco
        {
            get { return _tipoEndereco; }
            set { _tipoEndereco = value; }
        }
        public Cidade Cidade
        {
            get { return _cidade; }
            set { _cidade = value; }
        }
        public StatusEndereco StatusEndereco
        {
            get { return _statusEndereco; }
            set { _statusEndereco = value; }
        }
        public TipoLogradouro TipoLogradouro
        {
            get { return _tipoLogradouro; }
            set { _tipoLogradouro = value; }
        }
        #endregion

        #region Construtores
        public OrganizacaoEndereco()
        {
            try
            {
                _context = new GENTEEntities();
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        public OrganizacaoEndereco(int idOrganizacaoEndereco)
        {
            try
            {
                _context = new GENTEEntities();
                Carregar(idOrganizacaoEndereco);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        #endregion

        #region Metodos Privados
        protected void Carregar(int idOrganizacaoEndereco)
        {
            try
            {
                var consulta = from oe in _context.tab_organizacao_endereco
                               where oe.id_organizacao_endereco == idOrganizacaoEndereco
                               select new
                               {
                                   oe.id_organizacao_endereco,
                                   oe.tab_organizacao.Id_organizacao,
                                   oe.logradouro,
                                   oe.numero,
                                   oe.complemento,
                                   oe.bairro,
                                   oe.cep,
                                   oe.tab_cidade.id_cidade,
                                   oe.tab_tipo_endereco.id_tipo_endereco,
                                   oe.tab_status_endereco.id_status_endereco,
                                   oe.tab_tipo_logradouro.id_tipo_logradouro
                               };

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    this._idOrganizacaoEndereco = list.id_organizacao_endereco;
                    this._idOrganizacao = list.Id_organizacao;
                    this._tipoEndereco = new TipoEndereco(list.id_tipo_endereco);
                    this._logradouro = list.logradouro;
                    this._numero = (list.numero == null) ? 0 : Double.Parse(list.numero.ToString()); //(list.ordem == null) ? 0 : Int32.Parse(list.ordem.ToString());
                    this._complemento = list.complemento;
                    this._bairro = list.bairro;
                    this._cidade = new Cidade(list.id_cidade);
                    this._cep = list.cep;
                    this._statusEndereco = new StatusEndereco(list.id_status_endereco);
                    this._tipoLogradouro = new TipoLogradouro(list.id_tipo_logradouro);
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        #endregion

        #region Metodos Publicos

        #region Metodos Selecao
        public List<OrganizacaoEndereco> SelectAll()
        {
            try
            {
                List<OrganizacaoEndereco> listOrganizacaoEndereco = new List<OrganizacaoEndereco>();

                var consulta = from oe in _context.tab_organizacao_endereco
                               select new
                               {
                                   oe.id_organizacao_endereco,
                                   oe.tab_organizacao.Id_organizacao,
                                   oe.logradouro,
                                   oe.numero,
                                   oe.complemento,
                                   oe.bairro,
                                   oe.cep,
                                   oe.tab_cidade.id_cidade,
                                   oe.tab_tipo_endereco.id_tipo_endereco,
                                   oe.tab_status_endereco.id_status_endereco,
                                   oe.tab_tipo_logradouro.id_tipo_logradouro
                               };

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    OrganizacaoEndereco organizacaoEndereco = new OrganizacaoEndereco();
                    organizacaoEndereco.IdOrganizacaoEndereco = list.id_organizacao_endereco;
                    organizacaoEndereco.IdOrganizacao = list.Id_organizacao;
                    organizacaoEndereco.TipoEndereco = new TipoEndereco(list.id_tipo_endereco);
                    organizacaoEndereco.Logradouro = list.logradouro;
                    organizacaoEndereco.Numero = (list.numero == null) ? 0 : Double.Parse(list.numero.ToString());
                    organizacaoEndereco.Complemento = list.complemento;
                    organizacaoEndereco.Bairro = list.bairro;
                    organizacaoEndereco.Cidade = new Cidade(list.id_cidade);
                    organizacaoEndereco.Cep = list.cep;
                    organizacaoEndereco.StatusEndereco = new StatusEndereco(list.id_status_endereco);
                    organizacaoEndereco.TipoLogradouro = new TipoLogradouro(list.id_tipo_logradouro);

                    listOrganizacaoEndereco.Add(organizacaoEndereco);
                }
                return listOrganizacaoEndereco;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        public List<OrganizacaoEndereco> SelectOrganizacao(int idOrganizacao)
        {
            try
            {
                List<OrganizacaoEndereco> listOrganizacaoEndereco = new List<OrganizacaoEndereco>();

                var consulta = from oe in _context.tab_organizacao_endereco
                               where oe.tab_organizacao.Id_organizacao == idOrganizacao
                               select new
                               {
                                   oe.id_organizacao_endereco,
                                   oe.tab_organizacao.Id_organizacao,
                                   oe.logradouro,
                                   oe.numero,
                                   oe.complemento,
                                   oe.bairro,
                                   oe.cep,
                                   oe.tab_cidade.id_cidade,
                                   oe.tab_tipo_endereco.id_tipo_endereco,
                                   oe.tab_status_endereco.id_status_endereco,
                                   oe.tab_tipo_logradouro.id_tipo_logradouro
                               };

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    OrganizacaoEndereco organizacaoEndereco = new OrganizacaoEndereco();
                    organizacaoEndereco.IdOrganizacaoEndereco = list.id_organizacao_endereco;
                    organizacaoEndereco.IdOrganizacao = list.Id_organizacao;
                    organizacaoEndereco.TipoEndereco = new TipoEndereco(list.id_tipo_endereco);
                    organizacaoEndereco.Logradouro = list.logradouro;
                    organizacaoEndereco.Numero = (list.numero == null) ? 0 : Double.Parse(list.numero.ToString());
                    organizacaoEndereco.Complemento = list.complemento;
                    organizacaoEndereco.Bairro = list.bairro;
                    organizacaoEndereco.Cidade = new Cidade(list.id_cidade);
                    organizacaoEndereco.Cep = list.cep;
                    organizacaoEndereco.StatusEndereco = new StatusEndereco(list.id_status_endereco);
                    organizacaoEndereco.TipoLogradouro = new TipoLogradouro(list.id_tipo_logradouro);

                    listOrganizacaoEndereco.Add(organizacaoEndereco);
                }
                return listOrganizacaoEndereco;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        public List<OrganizacaoEndereco> SelectOrganizacao(Double cnpj)
        {
            try
            {
                List<OrganizacaoEndereco> listOrganizacaoEndereco = new List<OrganizacaoEndereco>();

                var consulta = from oe in _context.tab_organizacao_endereco
                               where oe.tab_organizacao.cnpj == cnpj
                               select new
                               {
                                   oe.id_organizacao_endereco,
                                   oe.tab_organizacao.Id_organizacao,
                                   oe.logradouro,
                                   oe.numero,
                                   oe.complemento,
                                   oe.bairro,
                                   oe.cep,
                                   oe.tab_cidade.id_cidade,
                                   oe.tab_tipo_endereco.id_tipo_endereco,
                                   oe.tab_status_endereco.id_status_endereco,
                                   oe.tab_tipo_logradouro.id_tipo_logradouro
                               };

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    OrganizacaoEndereco organizacaoEndereco = new OrganizacaoEndereco();
                    organizacaoEndereco.IdOrganizacaoEndereco = list.id_organizacao_endereco;
                    organizacaoEndereco.IdOrganizacao = list.Id_organizacao;
                    organizacaoEndereco.TipoEndereco = new TipoEndereco(list.id_tipo_endereco);
                    organizacaoEndereco.Logradouro = list.logradouro;
                    organizacaoEndereco.Numero = (list.numero == null) ? 0 : Double.Parse(list.numero.ToString());
                    organizacaoEndereco.Complemento = list.complemento;
                    organizacaoEndereco.Bairro = list.bairro;
                    organizacaoEndereco.Cidade = new Cidade(list.id_cidade);
                    organizacaoEndereco.Cep = list.cep;
                    organizacaoEndereco.StatusEndereco = new StatusEndereco(list.id_status_endereco);
                    organizacaoEndereco.TipoLogradouro = new TipoLogradouro(list.id_tipo_logradouro);

                    listOrganizacaoEndereco.Add(organizacaoEndereco);
                }
                return listOrganizacaoEndereco;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        #endregion

        #region Metodos de Persitencia
        public void Salvar()
        {
            try
            {
                if (_idOrganizacaoEndereco == 0)
                {
                    tab_organizacao_endereco tabEndereco = new tab_organizacao_endereco();
                    tabEndereco.tab_organizacaoReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_organizacao", "id_organizacao", _idOrganizacao);
                    tabEndereco.tab_tipo_enderecoReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_tipo_endereco", "id_tipo_endereco", _tipoEndereco.IdTipoEndereco);
                    tabEndereco.tab_tipo_logradouroReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_tipo_logradouro", "id_tipo_logradouro", _tipoLogradouro.IdTipoLogradouro);
                    tabEndereco.logradouro = _logradouro;
                    tabEndereco.numero = _numero;
                    tabEndereco.complemento = _complemento;
                    tabEndereco.bairro = _bairro;
                    tabEndereco.tab_cidadeReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_cidade", "id_cidade", _cidade.IdCidade);
                    tabEndereco.cep = _cep;
                    tabEndereco.tab_status_enderecoReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_status_endereco", "id_status_endereco", _statusEndereco.IdStatusEndereco);

                    _context.AddTotab_organizacao_endereco(tabEndereco);
                    _context.SaveChanges();
                }
                else
                {
                    tab_organizacao_endereco tabEndereco = (from oe in _context.tab_organizacao_endereco
                                                            where oe.id_organizacao_endereco == _idOrganizacaoEndereco
                                                            select oe).First();

                    tabEndereco.tab_organizacaoReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_organizacao", "id_organizacao", _idOrganizacao);
                    tabEndereco.tab_tipo_enderecoReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_tipo_endereco", "id_tipo_endereco", _tipoEndereco.IdTipoEndereco);
                    tabEndereco.tab_tipo_logradouroReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_tipo_logradouro", "id_tipo_logradouro", _tipoLogradouro.IdTipoLogradouro);
                    tabEndereco.logradouro = _logradouro;
                    tabEndereco.numero = _numero;
                    tabEndereco.complemento = _complemento;
                    tabEndereco.bairro = _bairro;
                    tabEndereco.tab_cidadeReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_cidade", "id_cidade", _cidade.IdCidade);
                    tabEndereco.cep = _cep;
                    tabEndereco.tab_status_enderecoReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_status_endereco", "id_status_endereco", _statusEndereco.IdStatusEndereco);

                    _context.SaveChanges();
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        #endregion

        #endregion
    }
}
